<?php

declare(strict_types=1);

namespace App\Utils\Encrypt;

use App\Master\Enum\RedisKeyEnum;
use App\Utils\RedisUtil;

class Aes
{
    /**
     * 加密
     * @param string $data 要加密的数据
     * @param string $key 密钥应该是16字节（128位），24字节（192位）或32字节（256位）
     * @param string $method 加密类型
     * @return string
     */
    public static function encode(string $data, string $key, string $method = 'AES-256-CBC'): string
    {
        $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($method)); // 生成随机IV
        $encrypted = openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv);
        // 使用base64编码输出加密数据，以便于存储和传输
        return base64_encode($iv . $encrypted);
    }

    /**
     * 解密
     * @param string $data 要加密的数据
     * @param string $key 密钥应该是16字节（128位），24字节（192位）或32字节（256位）
     * @param string $method 加密类型
     * @return false|string
     */
    public static function decode(string $data, string $key, string $method = 'AES-256-CBC'): false|string
    {
        $decodedData = base64_decode($data);
        $iv = substr($decodedData, 0, openssl_cipher_iv_length($method));// 提取IV
        $decryptedData = substr($decodedData, openssl_cipher_iv_length($method));// 提取加密文本
        return openssl_decrypt($decryptedData, $method, $key, OPENSSL_RAW_DATA, $iv);
    }

    private static function base64UrlEncode(string $input): string
    {
        return str_replace('=', '', strtr(base64_encode($input), '+/', '-_'));
    }

    private static function base64UrlDecode(string $input): false|string
    {
        $remainder = strlen($input) % 4;
        if ($remainder) {
            $add_len = 4 - $remainder;
            $input .= str_repeat('=', $add_len);
        }
        return base64_decode(strtr($input, '-_', '+/'));
    }
}